<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    function eat(car) {
			console.log(`car${car}`);
		}
		function fn(wrapfn) {
			function fns() {
				const car = "456"
				wrapfn(car)
			}
			return fns
		}
		fn(eat)()

		function fn1() {
			console.log("wsh3038971");
		}

		Function.prototype.before = function(fn) {
			// 保存函数引用
			// this指向fn1
			let that = this
			// 返回一个函数,相当于代理函数,包含了新函数和原函数
			// 原函数fn1
			// 新函数fn
			return function () {
				// 修改this指向
				// 执行新函数
				fn.apply(this)
				console.log(this);
				// 执行原函数并返回
				// 相当于fn1.apply(this), 原函数会执行
				return that.apply(this)
			}
		}
		// 将函数的预处理放在了before中,并且把预处理函数和原函数返回
		const find = fn1.before(function() { console.log("123456"); })
		find()

		// map高阶函数
		function pow(x) {
			return x * x
		}
		let arr = [1,2,3,4]
		let arrs = arr.map(pow)
  </script>
</body>
</html>